#include "RegGrammatica.h"

template<class DataType>
RegGrammatica<DataType>::RegGrammatica()
{
}

template<class DataType>
RegGrammatica<DataType>::RegGrammatica(set<DataType> helpSymbols, set<char> alphabet, set<ProductionRule <DataType> > productionRules, DataType startSymbol)
{
	N = helpSymbols;
	sigma = alphabet;
	P = productionRules;
	S = startSymbol;
}

template<class DataType>
RegGrammatica<DataType>::~RegGrammatica(void)
{
}

template<class DataType>
void RegGrammatica<DataType>::prodLine(ostream &os, const set<ProductionRule<DataType> >& allRules)
{		//print alle productieregels
		set<ProductionRule<DataType> > productionRules;
		for (set<ProductionRule<DataType> >::const_iterator rules = allRules.begin(); rules != allRules.end(); rules++) {
			os << *rules <<endl;
		}

}

template <class DataType> 
set<DataType> RegGrammatica <DataType>::getLanguage(int maxSteps)
{
	set<DataType> language;						//set met de gegenereerde woorden
	generateWords(maxSteps, S, "", language);	//recursieve functie aanroep	
	return language;							//return de set met gegenereerde woorden
}

template <class DataType> 
void RegGrammatica <DataType>::generateWords(unsigned int maxSteps, const DataType & nonTerminal, const string & word, set<DataType>& language)
{
	set< ProductionRule < DataType > >::iterator it;	
	if (word.size()<maxSteps)									//zolang word niet groter is als maxSteps
	{
		for(it = P.begin(); it != P.end(); it++)				//itereren over de productieregels
		{
			ProductionRule < DataType > nextRule = *it;
			if (nonTerminal == nextRule.getLeftNonTerminal())
			{
				if (nextRule.getRightTerminal()== EPS){			//als de rechter teminal een Epdilon is
					language.insert("Eps");
				}
				else
				{
					string resultWord = string(word + nextRule.getRightTerminal());	//terminal van regel toevoegen
					if (nextRule.getIfEnd())					//als er een terminal is gevonden		
					{											//wordt het wordt toegevoegd aan de set
						language.insert(resultWord);
					}
					else										//recursie
					{
						generateWords(maxSteps, nextRule.getRightNonTerminal(), resultWord, language);
					}
				}
			}
		}
	}
}
